/**
 * @file Hero.h
 * Definit les caracteristiques du Hero.
 */
#ifndef _HERO_H
#define _HERO_H
#include <iostream>
#include "terrain.h"
#include "element_niveau.h"
#include "niveau.h"
#include "Arme.h"
using namespace std;

/**
* @struct Hero
*/
struct Hero
{
    int x,y;///@param x entier position en x, y entier position en y
    int vie;///@param vie entier nombre de vie
    int pv;///@param pv entier nombre de points de vie
    arme* a;///@param a arme* l'arme du hero
    int niveau;///@param niveau entier nombre de niveau du heros
    int terrain;///@param terrain entier numero du terrain sur lequel il est
    int avancement;///@param avancement entier = 0: est dans le jeu, 1: a gagné le jue : fini, -1: mort : perdu
    char direction;///@param direction caractère = d : le héro est tourné vers la droite, = g le héro est tourné vers la gauche
    int score;///@param score entier, nombre de points du héros ;)
};

/**
@brief cree le hero avec les valeurs donnees
@param entier x y niv vie, arme* a
@return Hero*
*/
Hero* creerHero(int x,int y,int niv,int vie,arme* a);

/**
@brief initialise le hero avec les valeurs de porte de depart pour début de niveau
@param Hero* h, entiers x y niv vie
@return none
*/
void initHero(Hero* h,int x,int y,int niv,arme* a,int vie);

/**
@brief supprime le hero en effacant toute ses données, de la mémoire
@param Hero* h
@return none
*/
void supprimeHero(Hero* h);

/**
@brief le hero se déplace à gauche
@param Hero* h, niveau* niv
@return none
*/
void heroGauche(Hero* h, Niveau* niv);

/**
@brief le hero se déplace à droite
@param Hero* h niveau* niv
@return none
*/
void heroDroite(Hero* h, Niveau* niv);

/**
@brief le hero se déplace en haut
@param Hero* h, niveau* niv
@return none
*/
void heroHaut(Hero* h, Niveau* niv);

/**
@brief le hero se déplace en bas
@param Hero* h, niveau* niv
@return none
*/
void heroBas(Hero* h, Niveau* niv);

/**
@brief le hero se déplace vers la sortie
@param Hero* h, niveau* niv
@return none
*/
void heroSort(Hero* h, Niveau* niv);

/**
@brief renvoit le x ou se trouve le hero
@param Hero* constante h
@return entier
*/
int heroGetX(const Hero* h);

/**
@brief renvoit le y ou se trouve le hero
@param Hero* constante h
@return entier
*/
int heroGetY(const Hero* h);

/**
@brief renvoit les vies
@param Hero* h constante
@return entier
*/
int heroGetvie(const Hero* h);

/**
@brief renvoit les points de vies
@param Hero* constante h
@return entier
*/
int heroGetpv(const Hero* h);

/**
@brief renvoit l'arme utilisée
@param Hero* constante h
@return arme
*/
arme* heroGetarme(const Hero* h);

/**
@brief renvoit le niveau où le hero est
@param Hero* constante h
@return entier
*/
int heroGetniveau(const Hero* h);

/**
@brief renvoit le terrain où le hero est
@param Hero* constante h
@return entier
*/
int heroGetterrain(const Hero* h);

/**
@brief modifie la position en x du Hero
@param Hero* h, entier x
@return none
*/
void heroSetX(Hero* h,int x);

/**
@brief modifie la position en y du Hero
@param Hero* h, entier y
@return none
*/
void heroSetY(Hero* h,int y);

/**
@brief modifie le nombre de vies
@param Hero* h, entier vie
@return none
*/
void heroSetvie(Hero* h,int vie);

/**
@brief modifie les points de vies
@param Hero* h, entier pv
@return none
*/
void heroSetpv(Hero* h,int pv);

/**
@brief modifie l'arme du hero
@param Hero* h, arme* a
@return none
*/
void heroSetarme(Hero* h,arme* a);

/**
@brief modifie le niveau du Hero
@param Hero* h, entier niv
@return none
*/
void heroSetniveau(Hero* h,int niv);

/**
@brief modifie le terrain sur lequel se trouve le Hero
@param Hero* h, entier ter
@return none
*/
void heroSetterrain(Hero* h,int ter);

/**
@brief récupère l'avancement du héros
@param Hero* hero
@return int
*/
int heroGetAvancement(Hero* hero);

/**
@brief modifie l'avancement du héros
@param Hero* hero, entier avancement
@return none
*/
void heroSetAvancement(Hero* hero,int avancement);

/**
@brief récupère la direction du héros (de quel côté il est tourné)
@param Hero* hero
@return caractère
*/
char heroGetDirection(Hero* hero);

/**
@brief modifie la direction du héros
@param Hero* hero, caractère dir
@return none
*/
void heroSetDirection(Hero* hero, char dir);

/**
@brief récupère le score du héros
@param Hero* hero
@return entier
*/
int heroGetScore(Hero* hero);

/**
@brief modifie le score du héro
@param hero* hero, entier score
@return none
*/
void heroSetScore(Hero* hero, int score);

#endif
